#ifndef SEARCH_TREE_WIDGET_H
#define SEARCH_TREE_WIDGET_H

#include <QWidget>
#include <QTreeWidget>
#include <QLineEdit>
#include <QLabel>
#include <QMenu>
#include <QAction>
#include "state_info.h"

class DealerHandler;
class StateGroup;

/**
 * @brief 搜索树形控件
 * @details 包含搜索框和树形控件的组合控件
 */
class SearchTreeWidget : public QWidget
{
    Q_OBJECT

public:
    /**
     * @brief 构造函数
     * @param parent 父窗口
     */
    explicit SearchTreeWidget(QWidget *parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~SearchTreeWidget();

    /**
     * @brief 获取树形控件
     * @return 树形控件指针
     */
    QTreeWidget *treeWidget() const;

    /**
     * @brief 获取搜索框
     * @return 搜索框指针
     */
    QLineEdit *searchInput() const;

    /**
     * @brief 设置树形控件的表头标签
     * @param label 表头标签
     */
    void setHeaderLabel(const QString &label);

    /**
     * @brief 设置搜索框的占位符文本
     * @param text 占位符文本
     */
    void setSearchPlaceholderText(const QString &text);

    /**
     * @brief 设置是否启用右键菜单
     * @param enable 是否启用
     */
    void setContextMenuEnabled(bool enable);

    /**
     * @brief 设置是否启用快捷键
     * @param enable 是否启用
     */
    void setShortcutEnabled(bool enable);

    /**
     * @brief 设置是否启用双击
     * @param enable 是否启用
     */
    void setDoubleClickEnabled(bool enable);

    /**
     * @brief 刷新树形控件
     */
    void refreshTree();

    /**
     * @brief 编辑节点
     * @param item 要编辑的节点
     * @return 是否成功编辑
     */
    bool editNode(StateInfo* parent_state = nullptr);

    /**
     * @brief 添加节点
     * @param parent_state 父节点（主站）信息
     * @return 如果添加成功返回true，否则返回false
     */
    bool addNode(StateInfo* parent_state = nullptr);

    /**
     * @brief 删除节点
     * @param item 要删除的节点
     * @return 是否成功删除
     */
    bool deleteNode(StateInfo *state_info = nullptr);

    StateInfo* stateInfo();

    std::vector<StateInfo*>* stateInfoVec();

    /**
     * @brief 选中根节点
     */
    void selectRootNode();

    /**
     * @brief 获取主子站组
     * @param index 索引
     * @return 主子站组指针
     */
    StateGroup* stateGroupVec(int index);

    /**
     * @brief 获取主子站组数量
     * @return 主子站组数量
     */
    int stateGroupVecSize();

    /**
     * @brief 根据StateInfo选中对应的节点
     * @param state_info 要选中的节点信息
     * @return 是否成功选中
     */
    bool selectNodeByStateInfo(StateInfo* state_info);

protected:
    /**
     * @brief 显示事件处理函数
     * @param event 显示事件
     */
    void showEvent(QShowEvent *event) override;
signals:
    /**
     * @brief 搜索文本变化信号
     * @param text 搜索文本
     */
    void searchTextChanged(const QString &text);

    /**
     * @brief 新增节点信号
     * 
     */
    void addNodeRequested(int pid, int id);

    /**
     * @brief 编辑节点信号
     * @param item 要编辑的节点
     */
    void editNodeRequested(QTreeWidgetItem *item);

    /**
     * @brief 删除节点信号
     * @param item 要删除的节点
     */
    void deleteNodeRequested(QTreeWidgetItem *item);

    void itemDoubleClicked(const StateInfo &state_info);

    void itemClicked(const StateInfo &state_info);

protected:

private slots:
    /**
     * @brief 树形控件右键菜单处理函数
     * @param pos 右键点击位置
     */
    void onTreeContextMenu(const QPoint &pos);

    /**
     * @brief 搜索文本变化处理函数
     * @param text 搜索文本
     */
    void onSearchTextChanged(const QString &text);

    /**
     * @brief 树形控件项双击处理函数
     * @param item 被双击的项
     * @param column 列
     */
    void onItemDoubleClicked(QTreeWidgetItem *item, int column);

    /**
     *
     */
    void onItemClicked(QTreeWidgetItem *item, int column);

    /**
     * @brief 网络消息处理函数
     * @param method 方法
     * @param body 消息体
     */
    void onNetworkMessageReceived(const QString &method, const QString &body, bool is_error = false);

private:
    /**
     * @brief 添加所有节点（包括根节点和子节点）
     */
    void addNodes();

    /**
     * @brief 清空树形控件
     */
    void clearTree();

private:
    QTreeWidget *tree_widget_;                ///< 树形控件
    QLineEdit *search_input_;                 ///< 搜索框
    QLabel *search_label_;                    ///< 搜索标签
    bool context_menu_enabled_;               ///< 是否启用右键菜单
    bool shortcut_enabled_;                   ///< 是否启用快捷键
    bool double_click_enabled_;               ///< 是否启用双击
    QVector<StateGroup*> state_group_vec_;   ///< 主子站组
    DealerHandler *dealer_handler_;           ///< 网络管理器
};

#endif // SEARCH_TREE_WIDGET_H